﻿#ifndef BASE64_H
#define BASE64_H

#include <cstdint>
#include <string>
#include <string_view>
#include <optional>
#include <vector>

namespace base64 {

/**
 * 计算 base64 编码 x 字节所需的输出大小。
 */
constexpr size_t encoded_size(size_t input_size) {
    return ((input_size + 2) / 3) * 4 + 1;
}

/**
 * 解码 base64 编码的字符串。
 *
 * @param input      输入的 base64 编码字符串
 * @return           成功时返回解码后的数据，失败时返回空
 */
std::optional<std::vector<uint8_t>> decode(std::string_view input);

/**
 * 将数据编码为 base64 并以字符串形式返回。
 *
 * @param input      要编码的数据
 * @return           成功时返回编码后的字符串，失败时返回空
 */
std::optional<std::string> encode(const std::vector<uint8_t>& input);

/**
 * 编码 base64
 * @param txt 明文
 * @return 密文
 */
std::string encode_string(std::string_view txt);

/**
 * 解码 base64
 * @param txt 密文
 * @return 明文
 */
std::string decode_string(std::string_view txt);

} // namespace base64

#endif /* BASE64_H */
